<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //     //实例一
        //     function Class1(){
        //         console.log('初始化')
        //     }
        //     Class1.prototype.method=function(param){
        //         console.log(param)
        //         return this
        //     }
        //     let c1 = new Class1()
        //     //由于new在实例化的时候this会指向创建的对象，所以this.method这个方法会在原型链中找到
        //     c1.method('第一次调用').method('第二次链式调用').method('第三次链式调用')

        //     //实例二
        //     var obj = {
        //         a:function(){
        //             console.log('a');
        //             return this;
        //         },
        //         b:function(){
        //             console.log('b');
        //             return this;
        //         },
        //     }
        //     //实例三
        //     class Math{
        //         constructor(value){
        //             this.hasInit = true;
        //             this.value = value;
        //             if(!value){
        //                 this.value = 0;
        //                 this.hasInit = false;
        //             }
        //         }
        //         add(){
        //             let args = [...arguments];
        //             let intValue = this.hasInit ?this.value:args.shift();
        //             const value = args.reduce((prev,curv)=>prev+curv,initValue);
        //             return new Math(value)
        //         }
        //         minus(){
        //             let args = [...arguments];
        //             let initValue = this.hasInit ?this.value:args.shift();
        //             const value = args.reduce((prev,curv)=>prev-curv,initValue)
        //             return new Math(value)
        //         } 
        //         mul(){
        //             let args = [...arguments]
        //             let initValue = this.hasInit ?this.value:args.shift();
        //             const value = args.reduce((prev,curv)=>prev*curv,initValue)
        //             return new Math(value)
        //         }
        //         divide(){
        //             let args = [...arguments]
        //             let initValue = this.hasInit ?this.value:args.shift();
        //             const value = args.reduce((prev,curv)=>prev/(+curv?curv:1),initValue)
        //             return new Math(value)
        //         }
        //     }
        //  //原型链
        //  Number.prototype.add = function(){
        //      let _that = this
        //      _that = [...arguments].reduce((prev,curv)=>prev+curv,_that)
        //      return _that
        //  }
        //  Number.prototype.minus = function(){
        //      let _that = this
        //      _that = [...arguments].reduce((prev,curv)=>prev,_that)
        //      return _that
        //  }
        // 原型链
        Number.prototype.add = function () {
            let _that = this
            console.log(_that,'_that')
            _that = [...arguments].reduce((prev, curv) => prev + curv, _that)
            return _that
        }
        Number.prototype.minus = function () {
            let _that = this
            _that = [...arguments].reduce((prev, curv) => prev - curv, _that)
            return _that
        }
        Number.prototype.mul = function () {
            let _that = this
            _that = [...arguments].reduce((prev, curv) => prev * curv, _that)
            return _that
        }
        Number.prototype.divide = function () {
            let _that = this
            _that = [...arguments].reduce((prev, curv) => prev / (+curv ? curv : 1), _that)
            return _that
        }
        let num = 0;
        let newNum = num.add(222, 333, 444).minus(333, 222).mul(3, 3).divide(2, 3)
        console.log(newNum)
    </script>
</body>

</html>